﻿#region Copyright © 2001-2003 Jean-Claude Manoli [jc@manoli.net]
/*
 * Based on code submitted by Mitsugi Ogawa.
 * 
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the author(s) be held liable for any damages arising from
 * the use of this software.
 * 
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 * 
 *   1. The origin of this software must not be misrepresented; you must not
 *      claim that you wrote the original software. If you use this software
 *      in a product, an acknowledgment in the product documentation would be
 *      appreciated but is not required.
 * 
 *   2. Altered source versions must be plainly marked as such, and must not
 *      be misrepresented as being the original software.
 * 
 *   3. This notice may not be removed or altered from any source distribution.
 */
#endregion

namespace Nop.Services.Html.CodeFormatter;

/// <summary>
/// Generates color-coded T-SQL source code.
/// </summary>
public partial class TsqlFormat : CodeFormat
{
    /// <summary>
    /// Regular expression string to match single line 
    /// comments (--). 
    /// </summary>
    protected override string CommentRegex => @"(?:--\s).*?(?=\r|\n)";

    /// <summary>
    /// Regular expression string to match string literals. 
    /// </summary>
    protected override string StringRegex => @"''|'.*?'";

    /// <summary>
    /// Returns <b>false</b>, since T-SQL is not case sensitive.
    /// </summary>
    public override bool CaseSensitive => false;

    /// <summary>
    /// The list of T-SQL keywords.
    /// </summary>
    protected override string Keywords => "absolute action ada add admin after aggregate "
                                          + "alias all allocate alter and any are array as asc "
                                          + "assertion at authorization avg backup before begin "
                                          + "between binary bit bit_length blob boolean both breadth "
                                          + "break browse bulk by call cascade cascaded case cast "
                                          + "catalog char char_length character character_length "
                                          + "check checkpoint class clob close clustered coalesce "
                                          + "collate collation column commit completion compute "
                                          + "connect connection constraint constraints constructor "
                                          + "contains containstable continue convert corresponding "
                                          + "count create cross cube current current_date current_path "
                                          + "current_role current_time current_timestamp current_user "
                                          + "cursor cycle data database date day dbcc deallocate dec "
                                          + "decimal declare default deferrable deferred delete deny "
                                          + "depth deref desc describe descriptor destroy destructor "
                                          + "deterministic diagnostics dictionary disconnect disk "
                                          + "distinct distributed domain double drop dummy dump "
                                          + "dynamic each else end end-exec equals errlvl escape "
                                          + "every except exception exec execute exists exit external "
                                          + "extract false fetch file fillfactor first float for "
                                          + "foreign fortran found free freetext freetexttable from "
                                          + "full function general get global go goto grant group "
                                          + "grouping having holdlock host hour identity identity_insert "
                                          + "identitycol if ignore immediate in include index indicator "
                                          + "initialize initially inner inout input insensitive insert "
                                          + "int integer intersect interval into is isolation iterate "
                                          + "join key kill language large last lateral leading left "
                                          + "less level like limit lineno load local localtime localtimestamp "
                                          + "locator lower map match max min minute modifies modify "
                                          + "module month names national natural nchar nclob new next "
                                          + "no nocheck nonclustered none not null nullif numeric object "
                                          + "octet_length of off offsets old on only open opendatasource "
                                          + "openquery openrowset openxml operation option or order "
                                          + "ordinality out outer output over overlaps pad parameter "
                                          + "parameters partial pascal path percent plan position "
                                          + "postfix precision prefix preorder prepare preserve "
                                          + "primary print prior privileges proc procedure "
                                          + "public raiserror read reads readtext real reconfigure "
                                          + "recursive ref references referencing relative replication "
                                          + "restore restrict result return returns revoke right role "
                                          + "rollback rollup routine row rowcount rowguidcol rows rule "
                                          + "save savepoint schema scope scroll search second section "
                                          + "select sequence session session_user set sets setuser "
                                          + "shutdown size smallint some space specific specifictype "
                                          + "sql sqlca sqlcode sqlerror sqlexception sqlstate sqlwarning "
                                          + "start state statement static statistics structure substring "
                                          + "sum system_user table temporary terminate textsize than then "
                                          + "time timestamp timezone_hour timezone_minute to top trailing "
                                          + "tran transaction translate translation treat trigger trim "
                                          + "true truncate tsequal under union unique unknown unnest "
                                          + "update updatetext upper usage use user using value values "
                                          + "varchar variable varying view waitfor when whenever where "
                                          + "while with without work write writetext year zone";

    /// <summary>
    /// Use the pre-processor color to mark keywords that start with @@.
    /// </summary>
    protected override string Preprocessors => @"@@CONNECTIONS @@CPU_BUSY @@CURSOR_ROWS @@DATEFIRST "
                                               + "@@DBTS @@ERROR @@FETCH_STATUS @@IDENTITY @@IDLE "
                                               + "@@IO_BUSY @@LANGID @@LANGUAGE @@LOCK_TIMEOUT "
                                               + "@@MAX_CONNECTIONS @@MAX_PRECISION @@NESTLEVEL @@OPTIONS "
                                               + "@@PACK_RECEIVED @@PACK_SENT @@PACKET_ERRORS @@PROCID "
                                               + "@@REMSERVER @@ROWCOUNT @@SERVERNAME @@SERVICENAME @@SPID "
                                               + "@@TEXTSIZE @@TIMETICKS @@TOTAL_ERRORS @@TOTAL_READ "
                                               + "@@TOTAL_WRITE @@TRANCOUNT @@VERSION";
}